import BaseObject from "../../移动商城改/base/baseObject.js";
import OrderModel from "../model/orderModel.js";

/**
 * @description 订单控制器
 * @class {OrderController}
 * @author hhx
 * @date 2024-11-29 16:11
 * @version 0.1.2
 */
export default class OrderController extends BaseObject {

    /**
     * @description 视图
     * @private
     * @type {HTMLElement} 视图
     */
    _view = null;

    /**
     * @description 模型
     * @private
     * @type {OrderModel} 订单模型
     */
    _model = null;

    /**
     * @description 事件生产者
     * @private
     * @type {EventProduct} 事件生产者
     */
    _eventProduct = null

    /**
     * @description 订单控制器构造函数
     * @public
     * @constructor
     * @param props {Object} 配置对象
     */
    constructor(props) {
        super(props);
    }

    /**
     * @description 实例化 订单控制器
     * @public
     * @static
     * @param props {Object} 配置对象
     * @returns {OrderController|*} 订单控制器 实例
     */
    static instance(props) {
        let instance = new OrderController(props);
        instance.init(props);
        return instance;
    }

    //=========================== 成员属性 ===============================

    /**
     * @description 获取 视图
     * @member
     * @protected
     * @returns {HTMLElement} 视图
     */
    get view() {
        return this._view;
    }

    /**
     * @description 设置 视图
     * @member
     * @protected
     * @param newValue {HTMLElement} 视图
     */
    set view(newValue) {
        this._view = newValue;
    }

    /**
     * @description 获取 订单模型
     * @member
     * @protected
     * @returns {OrderModel} 订单模型
     */
    get model() {
        return this._model;
    }

    /**
     * @description 设置 订单模型
     * @member
     * @protected
     * @param newValue {OrderModel} 订单模型
     */
    set model(newValue) {
        this._model = newValue;
    }

    /**
     * @description 获取视图
     * @member
     * @protected
     * @returns {EventProduct} 视图
     */
    get eventProduct() {
        return this._eventProduct;
    }

    /**
     * @description 设置 事件生产者
     * @member
     * @protected
     * @param newValue {EventProduct} 事件生产者
     */
    set eventProduct(newValue) {
        this._eventProduct = newValue;
    }

    //=========================== 成员方法 ===============================

    /**
     * @description 获取 视图
     * @public
     * @returns {HTMLElement|*} 视图
     */
    getView() {
        return this.view;
    }

    /**
     * @description 设置 基本视图
     * @public
     * @param newValue {HTMLElement|*} 新的基本视图
     */
    setView(newValue) {
        this.view = newValue;
    }

    /**
     * @description 获取 模型
     * @public
     * @returns {OrderModel} 模型
     */
    getModel() {
        return this.model;
    }

    /**
     * @description 设置 模型
     * @public
     * @param newValue {OrderModel} 新的模型
     */
    setModel(newValue) {
        this.model = newValue;
    }

    /**
     * @description 获取 事件生产者
     * @public
     * @returns {EventProduct} 事件生产者
     */
    getEventProduct() {
        return this.eventProduct;
    }

    /**
     * @description 设置 事件生产者
     * @public
     * @param {EventProduct} newValue 事件生产者
     */
    setEventProduct(newValue) {
        this.eventProduct = newValue;
    }

    //=========================== 内部属性 ===============================

    //=========================== 属性方法 ===============================

    //=========================== 构建方法 ===============================

    /**
     * @description 重载方法
     * @protected
     * @override
     */
    init(props) {

        super.init(props);

        //初始化视图
        this.initView();

        //初始化数据模型
        this.initModel();

        //初始化事件订阅
        this.initSubscriberEvent();

    }

    //=========================== 内部方法 ===============================

    /**
     * @description 初始化视图
     * @protected
     */
    initView() {
        let view = this.createView();
        this.setView(view);
    }

    /**
     * @description 初始化模型
     * @protected
     */
    initModel() {
        let model = this.createModel();
        this.setModel(model);
    }

    /**
     * @description 初始化事件订阅
     * @protected
     */
    initSubscriberEvent() {
        this.subscriberOrderChange();
    }

    //=========================== 创建方法 ===============================

    /**
     * @description 创建视图
     * @protected
     * @return {HTMLElement} 视图
     */
    createView() {
        return document.createElement('div');
    }

    /**
     * @description 创建模型
     * @protected
     * @return {OrderModel} 订单模型
     */
    createModel() {
        return OrderModel.instance();
    }


    //=========================== 内部方法 ===============================

    //=========================== 事件订阅 ===============================

    /**
     * @description 订阅订单改变事件
     * @protected
     */
    subscriberOrderChange() {
        this.model.subscriberOrderChange(this.handleOrderChange.bind(this));
    }

    //=========================== 触发事件 ===============================

    //=========================== 处理方法 ===============================

    /**
     * @description 订单改变处理函数
     * @protected
     * @param param {*} 参数
     */
    handleOrderChange(param) {
        console.log('订单状态改变', '订单视图渲染', param);
    }

    //=========================== 接口方法 ===============================

    /**
     * @description 创建订单
     * @public
     * @param param {*} 参数
     */
    createOrder(param) {
        this.model.createOrder(this, param);
    }

}

